//package com.example.usercenter.job;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.example.usercenter.model.domain.User;
//import com.example.usercenter.service.UserService;
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.ValueOperations;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.util.Arrays;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//
///**
// * 缓存预热任务
// */
//@Component
//@Slf4j
//public class PreCacheJob {
//    @Resource
//    private UserService userService;
//
//    @Resource
//    private RedisTemplate<String, Object> redisTemplate;
//
//    @Resource
//    private RedissonClient redissonClient;
//
//    // 重点用户 -> 推荐
//    private List<Long> mainUserList = Arrays.asList(1L);
//
//
//    // 每天执行, 预热推荐用户
//    @Scheduled(cron = "0 4 0 * * *")
//    public void doCacheRecommendUser() {
//        RLock lock = redissonClient.getLock("yupao:precachejob:docache:lock");
//        try {
//            // 只有一个线程可以获取到锁
//            if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) {
//                for (Long userId : mainUserList) {
//                    // TODO 查数据库
//                    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//                    Page<User> userPage = userService.page(new Page<>(1, 20), queryWrapper);
//
//                    // TODO read to redis
//                    String redisKey = String.format("yupao:user:recommend:%s", userId);
//                    ValueOperations<String, Object> valueOptions = redisTemplate.opsForValue();
//
//                    // TODO write to redis
//                    try {
//                        valueOptions.set(redisKey, userPage, 30000, TimeUnit.MILLISECONDS);
//                    } catch (Exception e) {
//                        log.error("redis set key error", e);
//                    }
//                }
//            }
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } finally {
//            // 必须放到finally中, 因为放到try中try可能报错
//            // 只能释放自己的锁
//            if (lock.isHeldByCurrentThread()) {
//                lock.unlock();
//            }
//        }
//    }
//}
